using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Collections;
using System.Collections.Specialized;
using IBM.Data.DB2.iSeries;


namespace CargueDatos
{
    class accesoDatos400
    {
        private iDB2DataAdapter da = new iDB2DataAdapter();
        private iDB2Connection cn = new iDB2Connection();
        private iDB2Command cm = new iDB2Command();
        private string connectionString = "DataSource=192.168.22.56;DefaultCollection=CPXDATOS;UserID=transfer;Password=transfer";

        public accesoDatos400() {
            cn.ConnectionString = connectionString;
        }

        public int ejecutarSQL(string sqlStr) 
        {
            try
            {
                int numReg;
                cn.Open();
                cm.Connection = cn;
                cm.CommandText = sqlStr;
                numReg = cm.ExecuteNonQuery();
                cn.Close();
                return numReg;
            }
            catch (iDB2Exception ex)
            {
                //Es un error de sql, validar si es llave duplica por el codigo
                if (ex.MessageCode == -803)
                {
                    throw new Exception("Existe un nombre o llave Duplicada.", ex);
                }
                else if (ex.MessageCode == -532)
                {
                    throw new Exception("Se hace referencia a este registro en otra tabla.", ex);
                }
                else
                {
                    throw new Exception("Ocurrion un problema en la base de datos." + ex.Message, ex);
                }
            }
        }

        public bool ejecutarListaSQL(StringCollection sqlLista)
        {
            cn.Open();
            cm.Connection = cn;
            foreach (Object mSql in sqlLista)
            {
                cm.CommandText = mSql.ToString();
                cm.ExecuteNonQuery();
            }
            cn.Close();
            return true;
        }

        public DataTable leerDatosSQL(string sqlStr) {
            DataTable dt = new DataTable();
            cn.Open();
            cm.Connection = cn;
            cm.CommandText = sqlStr;
            da.SelectCommand = cm;
            da.Fill(dt);
            cn.Close();
            return dt;
        }

        public string leerValorSQL(string sqlStr)
        {
            string tValor;
            object tCampo;
            cn.Open();
            cm.Connection = cn;
            cm.CommandText = sqlStr;

            tCampo = cm.ExecuteScalar();
            if (tCampo == null)
            {
                tValor = "";
            }
            else
            {
                tValor = tCampo.ToString();
            }

            cn.Close();
            return tValor;
        }

        public void RunDB2Transaction(StringCollection sqlLista)
        {
            cn.Open();
            cm.Connection = cn;
            iDB2Transaction myTrans;

            // Iniciar Transaccion Local
            myTrans = cn.BeginTransaction(IsolationLevel.ReadCommitted);
            // Asignar el objeto transaccion para las transacciones locales pendientes
            cm.Transaction = myTrans;
            try
            {
                foreach (Object mSql in sqlLista)
                {
                    cm.CommandText = mSql.ToString();
                    cm.ExecuteNonQuery();
                }
                myTrans.Commit();
            }
            catch (Exception e)
            {
                myTrans.Rollback();
                throw new Exception(e.Message);
            }
            finally
            {
                cn.Close();
            }
        }

    }
}
